Spring Boot Client এ Caching এবং Rate Limiting ব্যবহার করে পারফরম্যান্স অপ্টিমাইজেশন করা অত্যন্ত কার্যকর পদ্ধতি। Caching পুনরাবৃত্ত রিকোয়েস্টের প্রতিক্রিয়া দ্রুত প্রদান করতে ব্যবহৃত হয়, এবং Rate Limiting সার্ভারের উপর অতিরিক্ত লোড পড়া থেকে রক্ষা করে। নিচে এই দুটি পদ্ধতি বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে:
Caching
Caching এর ধারণা
Caching ব্যবহার করে ক্লায়েন্ট API রেসপন্সগুলো মেমোরি বা স্টোরেজে সংরক্ষণ করে। একবার ডেটা ক্যাশে সংরক্ষিত হলে, একই রিকোয়েস্টের জন্য সার্ভারে না গিয়ে ক্যাশ থেকে দ্রুত রেসপন্স প্রদান করা যায়।
Spring Boot এ Caching এর ইমপ্লিমেন্টেশন
১. Maven Dependency যোগ করুন
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
২. Cache Configuration
Application Class এ @EnableCaching এনোটেশন যোগ করুন:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class SpringBootClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootClientApplication.class, args);
}
}
৩. Cache ব্যবহার করে Service তৈরি করুন
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ApiService {
private final RestTemplate restTemplate = new RestTemplate();
@Cacheable("apiData")
public String fetchData() {
String url = "https://api.example.com/data";
System.out.println("Fetching data from API...");
return restTemplate.getForObject(url, String.class);
}
}
৪. Cache Configuration
application.yml ফাইল:
spring:
cache:
type: simple # Simple in-memory cache
৫. Cache Clear করা (ঐচ্ছিক)
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
@Service
public class CacheService {
@CacheEvict(value = "apiData", allEntries = true)
public void clearCache() {
System.out.println("Cache cleared!");
}
}
Rate Limiting
Rate Limiting এর ধারণা
Rate Limiting এমন একটি পদ্ধতি যা নির্দিষ্ট সময়ে API রিকোয়েস্টের সংখ্যা সীমাবদ্ধ করে। এটি সার্ভারের অতিরিক্ত লোড এড়াতে সহায়ক।
Spring Boot এ Rate Limiting এর ইমপ্লিমেন্টেশন
১. Maven Dependency যোগ করুন
<dependency>
<groupId>com.github.bucket4j</groupId>
<artifactId>bucket4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
২. API এর উপর Rate Limiting প্রয়োগ করুন
Rate Limiter Filter তৈরি করুন:
import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Bucket;
import io.github.bucket4j.Bucket4j;
import io.github.bucket4j.Refill;
import org.springframework.stereotype.Component;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.Duration;
@Component
public class RateLimiterFilter extends javax.servlet.Filter {
private final Bucket bucket;
public RateLimiterFilter() {
Bandwidth limit = Bandwidth.classic(5, Refill.greedy(5, Duration.ofMinutes(1)));
this.bucket = Bucket4j.builder().addLimit(limit).build();
}
@Override
public void doFilter(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (bucket.tryConsume(1)) {
chain.doFilter(request, response);
} else {
response.setStatus(HttpServletResponse.SC_TOO_MANY_REQUESTS);
response.getWriter().write("Too Many Requests");
}
}
}
৩. Rate Limiting Configuration
Filter Bean Configure করুন:
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RateLimiterConfig {
@Bean
public FilterRegistrationBean<RateLimiterFilter> rateLimiterFilter() {
FilterRegistrationBean<RateLimiterFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new RateLimiterFilter());
registrationBean.addUrlPatterns("/api/*"); // Apply on specific API endpoints
return registrationBean;
}
}
Caching এবং Rate Limiting একত্রে ব্যবহার করা
Spring Boot ক্লায়েন্টে Caching এবং Rate Limiting একত্রে ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে ভারসাম্য বজায় রাখা যায়।
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OptimizedApiService {
private final RestTemplate restTemplate = new RestTemplate();
@Cacheable("optimizedData")
public String fetchData() {
String url = "https://api.example.com/data";
System.out.println("Fetching data from API...");
return restTemplate.getForObject(url, String.class);
}
}
Performance Optimization এর সুবিধা
- Caching:
- Latency হ্রাস: রেসপন্স দ্রুত প্রদান করে।
- API কল কমায়: পুনরাবৃত্ত কল এড়ায়।
- ব্যবহারকারী অভিজ্ঞতা উন্নত করে।
- Rate Limiting:
- সার্ভারের লোড কমায়।
- DoS আক্রমণ থেকে সুরক্ষা দেয়।
- নিয়ন্ত্রিত API ব্যবহার নিশ্চিত করে।
উদাহরণ আউটপুট
Caching Example:
Fetching data from API... # First request
# Second request returns cached data, no "Fetching data" log
Rate Limiting Example:
Response: 200 OK # First 5 requests
Response: 429 Too Many Requests # Subsequent requests in the same minute
Best Practices
- Proper Cache Invalidation: ডেটা পরিবর্তনের সময় ক্যাশ আপডেট করুন।
- Rate Limit ভিন্ন API তে ভিন্নভাবে প্রয়োগ করুন।
- Monitoring ব্যবহার করুন: ক্যাশ এবং রেট লিমিটের পারফরম্যান্স ট্র্যাক করুন।
Caching এবং Rate Limiting একত্রে ব্যবহার করে Spring Boot Client অ্যাপ্লিকেশন আরও স্থিতিশীল এবং পারফরম্যান্স-উন্নত করা সম্ভব।
Read more